#include <stdio.h>
#include <string.h>
#include <stdbool.h>

struct node{
	char p[6];
	int data;
	char next[6];
};

void swap(struct node* A, struct node* B){
	struct node temp = *A;
	*A = *B;
	*B = temp;
}

void swapArr(struct node data[], int min, int K, int Max){
	if(min + K > Max - 1){
		return;
	}
	for(int i = 0; i < K / 2; i++){
		swap(&data[min + i], &data[min + K - i - 1]);
	}
	swapArr(data, min+K, K,  Max);
}

int main()
{
	char begin[5] = {0};
	int i = 0, j = 0, N = 0, K = 0;
	bool flag = false;
	scanf("%s %d %d", &begin, &N, &K);
	struct node n[N];
	struct node input[N];
	for(i = 0;i < N; i++){
		scanf("%s %d %s", &n[i].p, &n[i].data, &n[i].next);
	}
	//初始化input
	for(i = 0; i < N; i++){
		memset(input[i].p, 0, strlen(input[i].p));
		memset(input[i].next, 0, strlen(input[i].next));
		input[i].data = 0;
	}
	//给链表排序
	i = 0;
	while(1){
		if(!flag && strcmp(begin, n[j].p) == 0){
			input[i].data = n[j].data;
			strcat(input[i].next, n[j].next);
			strcat(input[i].p,  n[j].p);
			flag = true;
		}
		if(strcmp(input[i].next, n[j].p) == 0 ){
			i++;
			strcat(input[i].p,  n[j].p);
			input[i] .data = n[j].data;
			strcat(input[i].next, n[j].next);
			if(strcmp(input[i].next, "-1") == 0){
				break;
			}
		}
		if(++j > N){
			j = 0;
		}
	}
	//反转链表
	swapArr(input, 0, K, N);
	printf("\n");
	for(i = 0; i < N; i++){
		printf("%s %d %s\n", input[i].p, input[i].data, input[i].next);
	}
	return 0;
}
